from machine import Pin, UART
import time

# --------------------------
# 1. 硬件参数配置（根据实际接线修改）
# --------------------------
# （可选）若连接了编码器，可添加编码器引脚配置（参考之前接线）
ENCODER_A = Pin(2, Pin.IN, Pin.PULL_UP)  # A相脉冲引脚（上拉输入，防干扰）
ENCODER_B = Pin(4, Pin.IN, Pin.PULL_UP)  # B相脉冲引脚
ENCODER_Z = Pin(5, Pin.IN, Pin.PULL_UP)  # Z相原点引脚

# --------------------------
# 2. 初始化硬件
# --------------------------

# （可选）初始化编码器脉冲计数变量
encoder_count = 0  # 总脉冲数
last_a_state = ENCODER_A.value()  # 记录A相上一状态（用于边沿检测）

# --------------------------
# 3. 辅助函数（信息格式化+编码器计数）
# --------------------------
def format_output_info(count):
    """格式化输出信息：包含时间戳、脉冲计数（若接编码器）"""
    current_time = time.ticks_ms()  # 获取当前毫秒时间戳
    # 自定义输出内容，可根据需求修改（支持英文/数字，中文需额外处理编码）
    info = f"[Time: {current_time}ms] " \
           f"Encoder Count: {count} " \
           f"UART Test: Normal\n"
    return info.encode("utf-8")  # 转为字节流（UART需发送字节数据）

def update_encoder_count():
    """更新编码器脉冲计数（边沿检测法，避免抖动）"""
    global encoder_count, last_a_state
    current_a = ENCODER_A.value()
    current_b = ENCODER_B.value()
    
    # 检测A相上升沿（或下降沿，根据编码器输出调整）
    if current_a != last_a_state and current_a == 1:
        # 根据B相状态判断旋转方向（正转+1，反转-1）
        if current_b == 0:
            encoder_count += 1
        else:
            encoder_count -= 1
    last_a_state = current_a  # 更新A相状态

# --------------------------
# 4. 主循环（UART输出+接收处理）
# --------------------------
print("UART Info Output Started...")  # 串口监视器提示（ESP32自身串口）

while True:
    # 4.1 （可选）更新编码器计数（若未接编码器，可删除此句）
    update_encoder_count()
    
    # 4.2 UART输出信息（每300ms一次，与原代码周期一致）
    output_data = format_output_info(encoder_count)
    # 同时打印到ESP32的串口监视器（方便调试）
    print("Sent:", output_data.decode("utf-8").strip())

#     time.sleep(0.1)